// const { SyncHook } = require("tapable");

// const hook = new SyncHook(["arg1", "arg2", "arg3"]);

// hook.tap("plugin-1", (arg1, arg2, arg3) => {
//   console.log("plugin-1", arg1, arg2, arg3);
// });

// hook.tap("plugin-2", (arg1, arg2, arg3) => {
//   console.log("plugin-2", arg1, arg2, arg3);
// });

// hook.call(1, 2, 3);

// console.log("所有hook都处理这个事件了");

//SyncWaterfallHook
// const { SyncWaterfallHook } = require("tapable");

// //创建hook
// const hook = new SyncWaterfallHook(["arg1", "arg2", "arg3"]);

// //注册钩子的回调
// hook.tap("plugin-1", (arg1, arg2) => {
//   console.log("plugin-1", arg1, arg2);
//   return arg1 + arg2;
// });

// hook.tap("plugin-2", (arg1, arg2, arg3) => {
//   console.log("plugin-2", arg1, arg2, arg3); //3 2 3 如果上一个钩子有返回值,arg1是上一个钩子的返回值
// });

// //触发钩子事件
// hook.call(1, 2, 3);

// console.log("所有hook都处理这个事件了");

//SyncWaterfallHook
// const { SyncBailHook } = require("tapable");

// //创建hook
// const hook = new SyncBailHook(["arg1", "arg2", "arg3"]);

// //注册钩子的回调
// hook.tap("plugin-1", (arg1, arg2) => {
//   console.log("plugin-1", arg1, arg2);
//   return arg1 + arg2;
// });

// hook.tap("plugin-2", (arg1, arg2, arg3) => {
//   console.log("plugin-2", arg1, arg2, arg3); //3 2 3 如果上一个钩子有返回值,arg1是上一个钩子的返回值
// });

// //触发钩子事件
// hook.call(1, 2, 3);

// console.log("只有plugin-1的hook处理这个事件了");

//AsyncParallelHook tapAsync
// const { AsyncParallelHook } = require("tapable");

// //创建hook
// const hook = new AsyncParallelHook(["arg1", "arg2", "arg3"]);

// //注册钩子的回调 hook.tapAsync hook.tapPromise
// hook.tapAsync("plugin-1", (arg1, arg2, arg3, callback) => {
//   console.log("plugin-1", arg1, arg2, arg3);

//   setTimeout(() => {
//     console.log("plugin-1结束了");
//     //处理结束，一定要调用这个回调函数
//     callback();
//   }, 1000);
// });

// hook.tapAsync("plugin-2", (arg1, arg2, arg3, callback) => {
//   console.log("plugin-2", arg1, arg2, arg3);

//   setTimeout(() => {
//     console.log("plugin-2结束了");
//     //处理结束，一定要调用这个回调函数
//     callback();
//   }, 500);
// });

// //触发钩子事件 callAsync
// hook.callAsync(1, 2, 3, (err) => {
//   //异步触发钩子时，回调被调用，才意味着所有的异步处理都完成了
//   console.log(err);
//   console.log("所有的结束了");
// });

// console.log("嘿嘿");

//AsyncParallelHook tapPromise
// const { AsyncParallelHook } = require("tapable");

// //创建hook
// const hook = new AsyncParallelHook(["arg1", "arg2", "arg3"]);

// //注册钩子的回调 hook.tapAsync hook.tapPromise
// hook.tapPromise("plugin-1", (arg1, arg2, arg3) => {
//   console.log("plugin-1", arg1, arg2, arg3);

//   return new Promise((resolve) => {
//     setTimeout(() => {
//       console.log("plugin-1结束了");
//       //处理结束，一定要调用这个回调函数
//       resolve();
//     }, 1000);
//   });
// });

// hook.tapPromise("plugin-2", (arg1, arg2, arg3) => {
//   console.log("plugin-2", arg1, arg2, arg3);

//   return new Promise((resolve) => {
//     setTimeout(() => {
//       console.log("plugin-2结束了");
//       //处理结束，一定要调用这个回调函数
//       resolve();
//     }, 500);
//   });
// });

// hook.tapPromise("plugin-3", async (arg1, arg2, arg3) => {
//   console.log("plugin-3", arg1, arg2, arg3);

//   await sleep(3000);

//   console.log("plugin-3结束了");
// });

// //触发钩子事件 callAsync
// hook.callAsync(1, 2, 3, (err) => {
//   //异步触发钩子时，回调被调用，才意味着所有的异步处理都完成了
//   console.log(err);
//   console.log("所有的结束了");
// });

// function sleep(ms) {
//   return new Promise((resolve) => {
//     setTimeout(() => {
//       resolve();
//     }, ms);
//   });
// }

// console.log("嘿嘿");

//AsyncSeriesHook  tapPromise
const { AsyncSeriesHook } = require("tapable");

//创建hook
const hook = new AsyncSeriesHook(["arg1", "arg2", "arg3"]);

//注册钩子的回调 hook.tapAsync hook.tapPromise
hook.tapPromise("plugin-1", (arg1, arg2, arg3) => {
  console.log("plugin-1", arg1, arg2, arg3);
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("plugin-1结束了");
      //处理结束，一定要调用这个回调函数
      resolve();
    }, 1000);
  });
});

hook.tapPromise("plugin-2", (arg1, arg2, arg3) => {
  console.log("plugin-2", arg1, arg2, arg3);

  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("plugin-2结束了");
      //处理结束，一定要调用这个回调函数
      resolve();
    }, 500);
  });
});

hook.tapPromise("plugin-3", async (arg1, arg2, arg3) => {
  console.log("plugin-3", arg1, arg2, arg3);
  await sleep(3000);
  console.log("plugin-3结束了");
});

//触发钩子事件 callAsync
hook.callAsync(1, 2, 3, (err) => {
  //异步触发钩子时，回调被调用，才意味着所有的异步处理都完成了
  console.log(err);
  console.log("所有的结束了");
});

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, ms);
  });
}

console.log("嘿嘿");
